package com.qf.proxy;

import com.qf.service.FangDongService;
import com.qf.service.FangDongServiceImpl;
import org.junit.Test;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.InvocationHandler;

import java.lang.reflect.Method;

/**
 * @version 1.0
 * @auther Administrator
 * @date 2023/2/7 11:36
 *  * 代理设计模式：
 *  *  1、静态代理设计模式
 *
 *  *  2、动态代理设计模式
 *          1、JDK动态代理 -- JDK
 *  *       2、Cglib动态管理 -- Cglib包 （第三包 引包）
 */
public class DynamicProxyTest {

    /**
     * JDK动态代理  代码实现
     */
    @Test
    public void testJdkDynamicProxy(){
        //房东 的核心业务
        FangDongService fangDongService = new FangDongServiceImpl();
        Class<?>[] interfaces = {FangDongService.class};
        // 执行代理对象的内容  （像我们之前的中介）
        InvocationHandler ih = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("===查看出租信息=========");
                System.out.println("===打电话去看房=========");
                fangDongService.zufang();//收钱
                System.out.println("===房屋的维护=========");
                System.out.println("===转租=========");
                return null;
            }
        };
        //1:Jdk动态代理  （底层使用到了反射 )
        /*FangDongService proxy = (FangDongService) Proxy.newProxyInstance(
                TestDynamicProxyTest.class.getClassLoader(),
                interfaces,
                ih
        );*/
        //proxy.zufang();
    }

    /**
     * Cglib: 动态代理  第三方包开发
     *
     *  房东 + 中介 = 租房
     *      房东是父类
     *      子类继承房东 = 子类中可以添加新功能；
     *
     *      默认连接池是父类
     *      Druid
     */
    @Test
    public void testCglibDynamicProxy(){
        //增强器 （代理） 儿子类
        Enhancer enhancer = new Enhancer();
        // 设置一个父类
        enhancer.setSuperclass(FangDongServiceImpl.class);
    }

}
